package com.disapand.strongarmy.commond

import cn.dev33.satoken.secure.*
import cn.hutool.core.io.*
import com.disapand.strongarmy.model.*
import org.ktorm.database.*
import org.ktorm.dsl.*
import org.ktorm.entity.*
import org.springframework.boot.*
import org.springframework.stereotype.*
import org.springframework.transaction.annotation.*

/**
 *
 * @auth disapand
 * @date 2021/10/19 - 10:30 - 星期二
 *
 */
@Component
@Transactional
class InitialAccount(private val database: Database) : ApplicationRunner {

    override fun run(args: ApplicationArguments) {

        /**
         * 如果初始化文件不存在，初步任务没有进行初始化，进入初始化过程
         */
        if (!FileUtil.exist(".initial")) {

            /**
             * 获取初始化参数里的 account 参数
             */
            val account = parseParams("account", args)

            /**
             * 获取初始化参数里的 password 参数
             */
            val password = parseParams("password", args)

            when {
                /**
                 * account 参数没有设置直接抛出异常，终止程序
                 */
                account === "" ->
                    throw Exception("account 参数是必须设置的")

                /**
                 * password 参数没有设置直接抛出异常，终止程序
                 */
                password === "" ->
                    throw Exception("password 参数是必须设置的")
                else -> {

                    /**
                     * 如果当前账号不存在则创建，存在则进行提示
                     */
                    var superAdmin = database.accounts.find { it.account eq account }
                    if (superAdmin == null) {

                        /**
                         * 查看是否存在超级管理员角色，不存在则创建
                         */
                        var role = database.roles.find { it.role eq "admin-super" }
                        if (role == null) {

                            /**
                             * 创建超级管理员角色
                             */
                            role = Role {
                                this.label = "超级管理员"
                                this.role = "super-admin"
                            }
                            database.roles.add(role)
                        }

                        /**
                         * 创建超级管理员账号
                         */
                        superAdmin = Account {
                            this.account = account
                            this.password = SaSecureUtil.sha1(password)
                            this.username = account
                        }
                        database.accounts.add(superAdmin)

                        /**
                         * 关联超级管理员账号和角色
                         */
                        database.insert(AccountRoles) {
                            set(it.role, role.id)
                            set(it.account, superAdmin.id)
                        }
                        println("账号初始化成功")
                        println("账号为：$account")
                        println("密码为：$password")
                    } else {
                        println("已存在相同的账户")
                    }

                }
            }
            FileUtil.touch(".initial")
        }
    }

    /**
     * 解析参数
     *
     * @param param
     * @param args
     * @return
     */
    private fun parseParams(param: String, args: ApplicationArguments): String {
        val values = args.getOptionValues(param)
        return if ( values != null && values.isNotEmpty()) {
            values[0]
        } else {
            ""
        }
    }
}